/**
 * 二次封装Ajax调用
 * 针对性修改
 *  1、alert弹框。 这里有统一错误处理，使用不同的插件时，alert方式不同，如有必要可以修改下面的alert(建议将alert封装到vue下面)
 *  其它一些处理，有需要可以做相应修改。但所有Ajax必须走这里在统一请求。防止后续扩展，如需要加header，处理返回值都问题。
 */
import axios from 'axios'
import Vue from 'vue'
import qs from 'qs'
var merge = require('webpack-merge')

//#region
// 拦截request,设置全局请求为ajax请求
// axios.interceptors.request.use((config) => {
//   config.headers['X-Requested-With'] = 'XMLHttpRequest'
//
//   return config
// })
//#endregion
axios.defaults.headers.common["X-Requested-With"] = "XMLHttpRequest"
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
axios.interceptors.request.use(function (config) {
    //post请示，固定加上group_id到Form里
    if(config.method  === 'post'){
        //group_id在我们系统中是必须的一个属性，一个人必须选择一个， 因此些这个值放到固定的Post数据中（原计划一个人可以属于多个组，前端可以切换，暂时订一个人只有一个组，所以就不存在切换行为了）
        if(window.zhaopinGlobal.GroupID > 0 && config.data.group_id == undefined){
            config.data.group_id = window.zhaopinGlobal.GroupID
        }
        //#region
        // window.zhaopinGlobal.UserInfo.GroupMembers[0].GroupID
        // var cv = ls.get(window.zhaopinGlobal.CurrentGroupIDKey)
        //     if(cv != null && cv != undefined) {
        //     if(t.groupId != parseInt(cv)){
        //         config.data.group_id = parseInt(cv)
        //     }
        // }
        //#endregion
        config.data = qs.stringify(config.data);
    }
    //#region
    // var from = (window.zhaopinGlobal && window.zhaopinGlobal.from) ? window.zhaopinGlobal.from.path : "";
    // if (from == null || from == undefined || from == '') from = document.referrer;
    //加入每一个请求时，后台需要的一些，前端可以得到的Header内容
    //config.headers.common['URL'] = 'URL'
    // config.headers.common['CategoryName'] = 'ResumeMobile'  //类别
    // config.headers.common['zpReferer'] = encodeURI(from)    //页面来源
    // config.headers.common['URL'] = document.location.href   //当前页面地址
    // config.headers.common['UserAgent'] = navigator.userAgent
    //#endregion

    //测试环境模拟当前登录人(仅测试环境有效)
    if(location.host.indexOf("localhost")>=0 || location.host.indexOf("test.iresume.oa.com")>=0 || location.host.indexOf("test.iresumemobile.oa.com")>=0){
        var userId = getCookie("UserID")
        if(userId == null || userId == undefined || userId == "") userId = 1
        setCookie("UserID",userId)
        config.headers.common['UserID'] = userId
        config.headers.common['platform'] = 'wx'
    }

    return config;
})
// 拦截响应response，并做一些错误处理
// window.ajaxFlag = false;          //当有Ajax请求成功时，会将它标识为true. 这时，如果再有Ajax错误，就不应该自动刷新页面了，而是提示用户，点确定后再刷新（虽然也不太好，总比直接刷新好）。For：移动网关身份校验问题
axios.interceptors.response.use((response) => {
    // window.ajaxFlag = true;
    if(processError(response))  return response;
    else return Promise.reject(response.data);
}, function (error) {
    //401 登录过期
    if(error && error.response && error.response.status == 401){
        // window.zhaopinapi401 = true
        Vue.alert.show("登录过期，点击确定将重新登录", '',
            function(){
                window.location.reload()
            }
        );
        return
    }
    //API调用方，通过ignoreerror.ignore将调用的API地址放到Vue.ignoreapis对象中，如果API出错，不在上面的公共异常处理中提示用户，由调用方自行处理
    var apiurl = error.config.url;
    var flag = Vue.ignoreapis.indexOf(apiurl) >= 0;
    // console.log(Vue.ignoreapis);
    Vue.loading.hide();
    if (flag == false) Vue.toast.showText("读取数据出错，请检查网络. " 
        + (error != null && error.response != null ? error.response.statusText : "") + " " 
        + (error != null && error.response != null ? error.response.status : ""));
    return Promise.reject(error);
})

//API调用方，通过ignoreerror.ignore将调用的API地址放到Vue.ignoreapis对象中，如果API出错，不在上面的公共异常处理中提示用户，由调用方自行处理
Vue.ignoreapis = [];
var ignoreerror = {
    ignore: function (apiname) {
        if (Vue.ignoreapis.indexOf(apiname) >= 0) return;
        else Vue.ignoreapis.push(apiname);
    },
    ignoreCancel: function (apiname) {
        if (Vue.ignoreapis.indexOf(apiname) >= 0) Vue.ignoreapis.splice(Vue.ignoreapis.indexOf(apiname), 1);
    }
}

//API错误处理。 API返回的数据格式为：{Status: 0, Info: "请选择岗位类型。", Data: null, ErrorNo: 2003}，详细参考API JsonResult结构
function processError(response){
    if(response.data != null && response.data != undefined){
        if(response.data.ErrorNo == 9003){
            //登录过期
            //alert(response.data.Info)
            Vue.loading.hide()
            Vue.toast.showText(response.data.Info);
            return false;
        } else if (response.data.ErrorNo > 0){
            Vue.loading.hide()
            Vue.toast.showText(response.data.Info);
            //alert(response.data.Info)
            return false;
        }
    }
    return true;
}

export default {
    install(Vue) {
        Vue.prototype.$zpHttp = axios
        Vue.zpHttp = axios
    },
    // $zpHttp: axios
}

export const $zpHttp = merge(axios, ignoreerror);

